Windows Phoneでのクラス単体テスト
こんにちは。くろの(福田)です。
Windows Phoneでのクラス単体テストの仕方をメモっておきたいと思います。
手順
- Windows Phoneアプリケーションを作成する
- Windows Phone Test Projectをソリューションに追加する
- NuGetでライブラリを追加する
- テストプロジェクトにアプリケーションプロジェクトの参照を追加する
- TestCaseクラスを作成する
- Windows Phoneでテストを実行する
(1)Windows Phoneアプリケーションを作成する
まず、Windows Phoneアプリケーションを作成します。名前は「TestPhoneApp」とします。「対象のWindows Phone OSのバージョン」はWindows Phone 7.1とします。
ここでは下記のようなユーティリティクラスをUtilフォルダ以下に「MyUtil.cs」という名前で作成します。
using System; namespace TestPhoneApp.Util { public class MyUtil { public static String ConvertCharacter(String characterName) { String cloudName = ""; switch (characterName) { case "クラウディア": cloudName = "Windows Azure"; break; case "ダンボー": cloudName = "Amazon Web Services"; break; default: cloudName = "不明"; break; } return cloudName; } } }
(2)Windows Phone Test Projectをソリューションに追加する
次に、Windows Phone Test Projectをソリューションに追加します。
ソリューションを右クリックして追加>新しいプロジェクトで「新しいプロジェクト」ダイアログを開きます。
左のメニューからオンラインテンプレート>テンプレート>Silverlightと進むと「Windows Phone Test Project」があります。
これを追加します。名前は「TestPhoneAppTest」とします。
(※Microsoft提供プロジェクトテンプレートではありません)
(3)NuGetでライブラリを追加する
NuGetで最新のテスト関連ライブラリを落としておきます。
(NuGetがインストールされていない場合はツール>拡張機能マネージャからNuGet Package Managerをインストールしておきます)
ツール>Library Package Manager>Package Manager Consoleでコンソールを開きます。
Package sourceは「NuGet official package source」のまま、Default projectは「TestPhoneAppTest」(テストプロジェクト側にライブラリを追加します)にします。
下記コマンドを実行し、最新のWindows Phone Essentials Testingを取得します。
PM> Install-Package WindowsPhoneEssentials.Testing Attempting to resolve dependency 'WindowsPhoneEssentials (= 0.7.2.88)'. Successfully installed 'WindowsPhoneEssentials 0.7.2.88'. Successfully installed 'WindowsPhoneEssentials.Testing 0.7.2.88'. Successfully added 'WindowsPhoneEssentials 0.7.2.88' to TestPhoneAppTest. Successfully added 'WindowsPhoneEssentials.Testing 0.7.2.88' to TestPhoneAppTest.
(※)Windows Phone Essentials Testing
Mango向けにアップデートされたSilverlight Unit Test Framework、テストヘルパー、Windows Phoneのコアクラスをテストするための抽象化レイヤー(WindowsPhone.Abstractions)への参照を追加します。
(参考)Windows Phone Essentials - Windows Phone Foundations
http://windowsphonefoundations.net/windowsphoneessentials
(4)テストプロジェクトにアプリケーションプロジェクトの参照を追加する
「TestPhoneAppTest」プロジェクトの参照設定に「TestPhoneApp」を追加しておきます。
(5)TestCaseクラスを作成する
一般的なXUnitと同様にTestCaseクラスを作成します。Testsフォルダ内にTestClass1.csが作成されているので、そのクラスを修正していきます。
using System; using Microsoft.Silverlight.Testing; using Microsoft.VisualStudio.TestTools.UnitTesting; using TestPhoneApp.Util; namespace TestPhoneAppTest.Tests { [TestClass] public class TestClass1 : SilverlightTest { String characterName = ""; String expected = ""; String actual = ""; [TestMethod] public void TestMethod1() { characterName = "クラウディア"; expected = "Windows Azure"; actual = testScenarioConvertCharacter(); Assert.AreEqual<String>(expected, actual); } [TestMethod] public void TestMethod2() { characterName = "ダンボー"; expected = "Amazon Web Services"; actual = testScenarioConvertCharacter(); Assert.AreEqual<String>(expected, actual); } [TestMethod] public void TestMethod3() { characterName = "あああああ"; //expected = "エラー"; expected = "不明"; actual = testScenarioConvertCharacter(); Assert.AreEqual<String>(expected, actual); } private String testScenarioConvertCharacter() { return MyUtil.ConvertCharacter(characterName); } } }
今回はGUIテストを行ったり、複雑な処理のテストは行っていないので、シンプルなテスト処理になっています。ポイントは[TestClass]属性、[TestMethod]属性を付けている部分です。
(6)Windows Phoneでテストを実行する
テストを実行します。「TestPhoneAppTest」プロジェクトを実行する事により、テストアプリケーションがWindows Phone上で実行されます。
ここでは「デバッグなしで開始」でテストアプリケーションを実行します。エラーが起きた際に例外が発生しますので、最初はデバッグモードでは実行しません。
(問題が見つかった際に改めてデバッグモードで調査するのはOKです)
プロジェクト内のテストクラス一覧>テストクラス内のテストメソッド一覧の順にドリルダウンしてテストの状況を確認する事が出来ます。テストが失敗するとバーが赤くなります。
これでクラス単体テストの環境が整いました。ユーティリティクラスやコンバータなどのテストであればすぐに実プロジェクトで活用可能かと思います。通信のテストやGUIのテストに関してはまた機会がありましたら。
おしまい